
package com.loan.rebate.common.dao;

import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;

import com.loan.rebate.common.param.BaseParam;

/**
 * 基础DAO
 *
 * @author 朱国军
 * @since 1.0
 * @version 2016年1月22日 朱国军
 */
public class BaseDao<T> extends SqlSessionDaoSupport {

    @Resource(name = "sqlSessionFactory")
    private SqlSessionFactory sqlSessionFactory;

    @PostConstruct
    public void SqlSessionFactory() {
        super.setSqlSessionFactory(sqlSessionFactory);
    }
    
    /**
     * 通用分页查询方法（将记录数量更新在paramter中）
     *
     * @param statement 查询LIST的sql名称，查询数量的sql在此名称后加_count
     * @param paramter 查询参数BaseParam的子类
     * @return 查询到的结果集,无结果则返回NULL
     */
    public List<T> queryList(String statement, BaseParam paramter) {
        if (paramter.getPageNo() == null || paramter.getPageNo() == 0) {
            paramter.setPageNo(1);
        }
        if (paramter.getPageSize() == null || paramter.getPageSize() == 0) {
            paramter.setPageSize(10);
        }
        Integer dataCount = this.getSqlSession().selectOne(statement + "_count", paramter);

        // 设置总记录数
        paramter.setDataCount(dataCount);
        // 设置总页码数
        Integer pageCount = dataCount % paramter.getPageSize() == 0 ? dataCount / paramter.getPageSize() : dataCount / paramter.getPageSize() + 1;
        paramter.setPageCount(pageCount);

        if (dataCount == 0) {
            paramter.setPageNo(1);
            return null;
        } else {
            Integer startNum = (paramter.getPageNo() - 1) * paramter.getPageSize();
            paramter.setStartNum(startNum);
            return this.getSqlSession().selectList(statement, paramter);
        }
    }

    /**
     * 通用分页查询方法（将记录数量更新在paramter中）
     *
     * @param statement 查询LIST的sql名称，查询数量的sql在此名称后加_count
     * @param paramter 查询参数BaseParam的子类
     * @return 查询到的结果集,无结果则返回NULL
     */
    public List<Map<String, Object>> queryMapList(String statement, BaseParam paramter) {
        if (paramter.getPageNo() == null || paramter.getPageNo() == 0) {
            paramter.setPageNo(1);
        }
        if (paramter.getPageSize() == null || paramter.getPageSize() == 0) {
            paramter.setPageSize(10);
        }
        Integer dataCount = this.getSqlSession().selectOne(statement + "_count", paramter);

        // 设置总记录数
        paramter.setDataCount(dataCount);
        // 设置总页码数
        Integer pageCount = dataCount % paramter.getPageSize() == 0 ? dataCount / paramter.getPageSize() : dataCount / paramter.getPageSize() + 1;
        paramter.setPageCount(pageCount);

        if (dataCount == 0) {
            paramter.setPageNo(1);
            return null;
        } else {
            Integer startNum = (paramter.getPageNo() - 1) * paramter.getPageSize();
            paramter.setStartNum(startNum);
            return this.getSqlSession().selectList(statement, paramter);
        }
    }
}
